package com.qjz.diancan.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
import org.springframework.stereotype.Component;

import java.security.Key;
import java.util.Date;

@Component
public class JwtTokenUtil {

    private static final Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    // 生成令牌
    public static String generateToken(String username)
    {
        return Jwts.builder().setSubject(username).setIssuedAt(new Date())
                   .setExpiration(new Date(System.currentTimeMillis() + 60000)) // 1小时
                   .signWith(key).compact();
    }

    // 验证令牌
    public static boolean validateToken(String token)
    {
        try {
            Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
            return true;
        } catch (JwtException | IllegalArgumentException e) {
            return false;
        }
    }

    // 从令牌中提取用户名
    public static String getUsernameFromToken(String token)
    {
        try {
            Claims claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
            return claims.getSubject();
        } catch (JwtException e) {
            System.err.println("Error parsing token: " + e.getMessage());
            return null;
        }
    }

    // 删除令牌（实际上无法删除已生成的令牌，只能在客户端或服务器端忽略或将其加入黑名单）
    public static void invalidateToken(String token)
    {
        // 在实际应用中，可以维护一个令牌黑名单，将无效令牌加入黑名单
        // 例如：redis.set(token, "invalid", expirationTime);
    }
}
